package pl.edu.pw.stud.ltrzaska.classloader;

import java.util.HashMap;

/**
 * 
 * Singleton. Pomocnicza pamiec podreczna, w ktorej przechowywane sa obiekty w
 * ramach jednej uruchomionej instancji aplikacji, aby nie powielac pobran
 * bajtkodu klas.
 * 
 * @param <V>
 *            typ przechowywany w pamieci.
 */

public class ClassCache<V> {
	private HashMap<String, V> entries = null;
	private static ClassCache<Object> instance = null;

	private ClassCache() {
		super();
		entries = new HashMap<String, V>();
	}

	/**
	 * Zwraca instancje Singleton-a, ktorym jest klasa <code>PoltaxCache</code>
	 * 
	 * @return instancja {@link PoltaxCache}
	 */
	static public ClassCache<Object> getInstance() {
		if (null == instance)
			instance = new ClassCache<Object>();

		return instance;
	}

	/**
	 * Wyczysc cale Cache tzn. usun wszystkie klucze i przypisane im obiekty.
	 */
	public void clear() {
		if (null != entries)
			entries.clear();
	}

	/**
	 * Wyluskuje wartosc o zadanym kluczu <code>key</code> z Cache.
	 * 
	 * @param key
	 * @return obiekt zapisany w Cache pod kluczem <code>key</code>
	 */
	public V get(String key) {
		return entries.get(key);
	}

	/**
	 * Sprawdza czy zadany klucz istnieje w pamieci podrecznej.
	 */
	public boolean containsKey(String key) {
		return entries.containsKey(key);
	}

	/**
	 * Zapisuje w Cache obiekt <code>value</code> pod kluczem <code>key</code>.
	 * 
	 * @param key
	 *            klucz pod ktorym zapisujemy obiekt. Aby pozniej wyszukac
	 *            zapisany obiekt, nalezy podac ten sam klucz.
	 * @param value
	 *            zapisywany w cache obiekt
	 */
	public void put(String key, V value) {
		entries.put(key, value);
	}

	/**
	 * Usuwa z cache pojedynczy wpis o zadanym w argumencie kluczu.
	 * 
	 * @param className
	 *            klucz, po ktorym usuwamy z cache.
	 */
	public void remove(String className) {
		if (this.containsKey(className)) {
			entries.remove(className);
		}
	}
}
